--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Commit 6327e16c1b740e72d0eceec32dbbb425bb8e90a7
Parents : 8a29c7f
Author : Ivan <ivan@quad4.io>
Signature : Signature validation error
Date : 2026-05-18T05:09:08-05:00
chore(config): remove git.quad4.io references from codebase
Changes
10 files changed, 85 insertions(+), 27 deletions(-)
Diff
diff --git a/electron/main.js b/electron/main.js
index ba468d39..9b36fe09 100644
--- a/electron/main.js
+++ b/electron/main.js
@@ -513,7 +513,7 @@ app.whenReady().then(async () => {
"style-src 'self' 'unsafe-inline'",
"img-src 'self' data: blob: https://*.tile.openstreetmap.org https://tile.openstreetmap.org https://*.cartocdn.com https://tiles.openfreemap.org https://*.openfreemap.org",
"font-src 'self' data: https://tiles.openfreemap.org https://*.openfreemap.org",
- "connect-src 'self' http://127.0.0.1:9337 https://127.0.0.1:9337 http://localhost:9337 https://localhost:9337 ws://127.0.0.1:* wss://127.0.0.1:* ws://localhost:* wss://localhost:* blob: https://*.tile.openstreetmap.org https://tile.openstreetmap.org https://nominatim.openstreetmap.org https://git.quad4.io https://*.cartocdn.com https://tiles.openfreemap.org https://*.openfreemap.org",
+ "connect-src 'self' http://127.0.0.1:9337 https://127.0.0.1:9337 http://localhost:9337 https://localhost:9337 ws://127.0.0.1:* wss://127.0.0.1:* ws://localhost:* wss://localhost:* blob: https://*.tile.openstreetmap.org https://tile.openstreetmap.org https://nominatim.openstreetmap.org https://github.com https://*.cartocdn.com https://tiles.openfreemap.org https://*.openfreemap.org",
"media-src 'self' blob:",
"worker-src 'self' blob:",
"frame-src 'self'",
diff --git a/meshchatx/meshchat.py b/meshchatx/meshchat.py
index 8734642c..bd96aaba 100644
--- a/meshchatx/meshchat.py
+++ b/meshchatx/meshchat.py
@@ -3507,7 +3507,7 @@ class ReticulumMeshChat:
<p>The MeshChatX web interface files were not found.</p>
<p>If you are running from source, you must build the frontend first:</p>
<pre style="background: #1e293b; padding: 1rem; border-radius: 4px; color: #e2e8f0; border: 1px solid #334155;">pnpm install && pnpm run build-frontend</pre>
- <p>For more information, see the <a href="https://git.quad4.io/RNS-Things/MeshChatX" style="color: #38bdf8;">README</a>.</p>
+ <p>For more information, see the <a href="https://github.com/Quad4-Software/MeshChatX" style="color: #38bdf8;">README</a>.</p>
</body>
</html>
""",
@@ -4243,17 +4243,16 @@ class ReticulumMeshChat:
return web.json_response({"error": "URL is required"}, status=400)
# Restrict to allowed sources for safety
- gitea_url = "https://git.quad4.io"
+ gitea_url = ""
if self.current_context and self.current_context.config:
gitea_url = self.current_context.config.gitea_base_url.get()
- if (
- not url.startswith(gitea_url + "/")
- and not url.startswith("https://git.quad4.io/")
- and not url.startswith("https://github.com/")
- and not url.startswith("https://objects.githubusercontent.com/")
- and not url.startswith("https://release-assets.githubusercontent.com/")
- ):
+ allowed = ["https://github.com/", "https://objects.githubusercontent.com/",
+ "https://release-assets.githubusercontent.com/"]
+ if gitea_url:
+ allowed.insert(0, gitea_url + "/")
+
+ if not any(url.startswith(a) for a in allowed):
return web.json_response({"error": "Invalid download URL"}, status=403)
try:
diff --git a/meshchatx/src/backend/config_manager.py b/meshchatx/src/backend/config_manager.py
index 0b017e70..3cde54d9 100644
--- a/meshchatx/src/backend/config_manager.py
+++ b/meshchatx/src/backend/config_manager.py
@@ -161,7 +161,7 @@ class ConfigManager:
self.gitea_base_url = self.StringConfig(
self,
"gitea_base_url",
- "https://git.quad4.io",
+ None,
)
# desktop config
diff --git a/meshchatx/src/frontend/components/micron-editor/MicronEditorPage.vue b/meshchatx/src/frontend/components/micron-editor/MicronEditorPage.vue
index 04592f83..a0240cda 100644
--- a/meshchatx/src/frontend/components/micron-editor/MicronEditorPage.vue
+++ b/meshchatx/src/frontend/components/micron-editor/MicronEditorPage.vue
@@ -17,7 +17,7 @@
{{ $t("tools.micron_editor.title") }}
</h1>
<a
- href="https://git.quad4.io/RFnexus"
+ href="https://github.com/RFnexus"
target="_blank"
rel="noopener noreferrer"
class="text-[10px] text-gray-500 hover:text-teal-500 transition-colors hidden sm:block leading-tight"
@@ -89,6 +89,26 @@
</div>
</div>
</div>
+ <button
+ v-if="wasmBundled"
+ type="button"
+ class="secondary-chip py-1! px-2! gap-1 text-[11px]!"
+ :class="{ 'text-teal-600! dark:text-teal-300! border-teal-300! dark:border-teal-700!': useWasm }"
+ :disabled="wasmLoading"
+ :title="$t(useWasm ? 'tools.micron_editor.wasm_active' : 'tools.micron_editor.wasm_inactive')"
+ @click="toggleWasmEngine"
+ >
+ <span
+ v-if="wasmLoading"
+ class="w-3 h-3 rounded-full border-2 border-current border-t-transparent animate-spin"
+ ></span>
+ <MaterialDesignIcon
+ v-else
+ :icon-name="useWasm ? 'lightning-bolt' : 'lightning-bolt-outline'"
+ class="w-3.5 h-3.5"
+ />
+ <span class="hidden sm:inline">{{ useWasm ? "WASM" : "JS" }}</span>
+ </button>
<button v-if="isMobileView" type="button" class="primary-chip py-1! px-3!" @click="toggleView">
<MaterialDesignIcon :icon-name="showEditor ? 'eye' : 'pencil'" class="w-3.5 h-3.5" />
{{ showEditor ? $t("tools.micron_editor.view_preview") : $t("tools.micron_editor.edit") }}
@@ -179,6 +199,7 @@
import MaterialDesignIcon from "../MaterialDesignIcon.vue";
import MicronParser from "../../js/MicronParser.js";
import { micronStorage } from "../../js/MicronStorage";
+import { preloadNomadMicronWasm, isMicronWasmBundled } from "../../js/MicronWasmLoader";
import DialogUtils from "../../js/DialogUtils";
export default {
@@ -198,6 +219,10 @@ export default {
editingTabName: "",
showPublishMenu: false,
pageNodes: [],
+ useWasm: false,
+ wasmReady: false,
+ wasmBundled: isMicronWasmBundled(),
+ wasmLoading: false,
};
},
watch: {
@@ -232,7 +257,11 @@ export default {
}
try {
const parser = new MicronParser(true);
- this.renderedContent = parser.convertMicronToHtml(this.tabs[this.activeTabIndex].content);
+ this.renderedContent = parser.convertMicronToHtml(
+ this.tabs[this.activeTabIndex].content,
+ {},
+ { useWasm: this.useWasm && this.wasmReady }
+ );
} catch (error) {
console.error("Error rendering micron:", error);
this.renderedContent = `<p style="color: red;">Error rendering: ${error.message}</p>`;
@@ -241,6 +270,25 @@ export default {
toggleView() {
this.showEditor = !this.showEditor;
},
+ async toggleWasmEngine() {
+ if (!this.wasmBundled) return;
+ if (this.useWasm) {
+ this.useWasm = false;
+ this.renderActiveTab();
+ return;
+ }
+ this.wasmLoading = true;
+ try {
+ const ready = await preloadNomadMicronWasm();
+ this.wasmReady = ready === true && typeof globalThis.micronConvert === "function";
+ if (this.wasmReady) {
+ this.useWasm = true;
+ this.renderActiveTab();
+ }
+ } finally {
+ this.wasmLoading = false;
+ }
+ },
async saveContent() {
try {
await micronStorage.saveTabs(this.tabs);
diff --git a/meshchatx/src/frontend/components/nomadnetwork/NomadNetworkPage.vue b/meshchatx/src/frontend/components/nomadnetwork/NomadNetworkPage.vue
index 9cb185b5..69db8571 100644
--- a/meshchatx/src/frontend/components/nomadnetwork/NomadNetworkPage.vue
+++ b/meshchatx/src/frontend/components/nomadnetwork/NomadNetworkPage.vue
@@ -689,7 +689,7 @@ export default {
return isMicronWasmBundled() && (GlobalState.config || {}).nomad_micron_wasm_enabled === true;
},
micronParserGoRepoUrl() {
- return "https://git.quad4.io/Go-Libs/micron-parser-go";
+ return "https://github.com/Quad4-Software/micron-parser-go";
},
nomadMicronWasmActive() {
const engineWasm = (GlobalState.config?.nomad_micron_default_engine || "js") === "wasm";
diff --git a/meshchatx/src/frontend/components/settings/SettingsPage.vue b/meshchatx/src/frontend/components/settings/SettingsPage.vue
index c9d824e2..08763c0a 100644
--- a/meshchatx/src/frontend/components/settings/SettingsPage.vue
+++ b/meshchatx/src/frontend/components/settings/SettingsPage.vue
@@ -923,7 +923,7 @@
{{ $t("settings.nomad_micron_wasm_desc_before_link") }}
<a
class="text-blue-600 hover:text-blue-700 dark:text-blue-400 dark:hover:text-blue-300 underline underline-offset-2"
- href="https://git.quad4.io/Go-Libs/micron-parser-go"
+ href="https://github.com/Quad4-Software/micron-parser-go"
target="_blank"
rel="noopener noreferrer"
>{{ $t("settings.nomad_micron_wasm_link_label") }}</a
@@ -2070,7 +2070,7 @@
<input
v-model="config.gitea_base_url"
type="text"
- placeholder="https://git.quad4.io"
+ placeholder="https://github.com/example-org"
class="input-field"
@input="onGiteaConfigChange"
/>
@@ -2728,7 +2728,7 @@ export default {
location_manual_lon: "0.0",
location_manual_alt: "0.0",
telemetry_enabled: false,
- gitea_base_url: "https://git.quad4.io",
+ gitea_base_url: "",
csp_extra_connect_src: "",
csp_extra_img_src: "",
csp_extra_frame_src: "",
diff --git a/scripts/build/fetch_reticulum_manual.py b/scripts/build/fetch_reticulum_manual.py
index 696a6261..97c9b5ea 100755
--- a/scripts/build/fetch_reticulum_manual.py
+++ b/scripts/build/fetch_reticulum_manual.py
@@ -38,7 +38,6 @@ from pathlib import Path
DEFAULT_SOURCES = (
"https://github.com/markqvist/reticulum_website/archive/refs/heads/main.zip",
- "https://git.quad4.io/Reticulum/reticulum_website/archive/main.zip",
)
DEFAULT_DEST = (
@@ -257,6 +256,18 @@ def main(argv: list[str] | None = None) -> int:
env_dest = os.environ.get("MESHCHATX_RETICULUM_DOCS_DEST")
dest = args.dest or (Path(env_dest) if env_dest else DEFAULT_DEST)
+ if _is_truthy(os.environ.get("MESHCHATX_OFFLINE_BUILD")):
+ if dest.exists() and any(dest.iterdir()):
+ logging.info(
+ "MESHCHATX_OFFLINE_BUILD=1 and Reticulum manual already present at %s; skipping fetch.",
+ dest,
+ )
+ return 0
+ logging.error(
+ "MESHCHATX_OFFLINE_BUILD=1 but Reticulum manual is missing at %s", dest
+ )
+ return 1
+
fetch_manual(
sources=sources,
dest=dest.resolve(),
diff --git a/scripts/rpi/install_meshchatx.sh b/scripts/rpi/install_meshchatx.sh
index e5e55d1a..206c856c 100755
--- a/scripts/rpi/install_meshchatx.sh
+++ b/scripts/rpi/install_meshchatx.sh
@@ -1,7 +1,7 @@
#!/usr/bin/env bash
set -euo pipefail
-# Official defaults target Gitea at git.quad4.io. Override for forks or mirrors:
+# Official defaults. Override for forks or mirrors:
# MESHCHATX_RELEASES_RSS Release feed (default: .../MeshChatX/releases.rss)
# MESHCHATX_REPO_BASE Repo root for synthesized wheel URLs if RSS has no
# .whl link in descriptions (default: derived from RSS URL)
@@ -151,12 +151,12 @@ discover_release_wheels() {
err "curl is required (RSS and downloads)."
return 1
fi
- MESHCHATX_RELEASES_RSS="${MESHCHATX_RELEASES_RSS:-https://git.quad4.io/RNS-Things/MeshChatX/releases.rss}"
+ MESHCHATX_RELEASES_RSS="${MESHCHATX_RELEASES_RSS:-https://github.com/Quad4-Software/MeshChatX/releases.rss}"
repo_base="${MESHCHATX_REPO_BASE:-}"
rss="$MESHCHATX_RELEASES_RSS"
[[ -n "$repo_base" ]] || repo_base="$(repo_base_from_rss "$rss")"
if ! raw="$(
- curl -fsSL -m 90 -H "User-Agent: MeshChatX-rpi-installer/1 (+https://git.quad4.io/RNS-Things/MeshChatX)" \
+ curl -fsSL -m 90 -H "User-Agent: MeshChatX-rpi-installer/1 (+https://github.com/Quad4-Software/MeshChatX)" \
"$rss" 2>/dev/null
)"; then
return 1
@@ -491,7 +491,7 @@ try_verify_and_localize_wheel() {
local src_url="${1:-}"
local bundle_url="${src_url}.cosign.bundle"
local code cbin kf wf bf
- MESHCHATX_COSIGN_PUB_URL="${MESHCHATX_COSIGN_PUB_URL:-https://git.quad4.io/RNS-Things/MeshChatX/raw/branch/master/cosign.pub}"
+ MESHCHATX_COSIGN_PUB_URL="${MESHCHATX_COSIGN_PUB_URL:-https://github.com/Quad4-Software/MeshChatX/raw/branch/master/cosign.pub}"
if ! code="$(curl -fsS -o /dev/null -w '%{http_code}' -I -L -m 30 "$bundle_url" 2>/dev/null)"; then
code="000"
fi
diff --git a/tests/frontend/MarkdownRenderer.test.js b/tests/frontend/MarkdownRenderer.test.js
index 49829809..49e1f25c 100644
--- a/tests/frontend/MarkdownRenderer.test.js
+++ b/tests/frontend/MarkdownRenderer.test.js
@@ -49,7 +49,7 @@ describe("MarkdownRenderer.js", () => {
});
it("keeps underscores intact in long https links", () => {
- const url = "https://git.quad4.io/RNS-Things/MeshChatX/src/branch/dev/docs/meshchatx_on_raspberry_pi.md";
+ const url = "https://github.com/Quad4-Software/MeshChatX/src/branch/dev/docs/meshchatx_on_raspberry_pi.md";
const result = MarkdownRenderer.render(`visit ${url}`);
expect(result).toContain(`href="${url}"`);
expect(result).toContain(url);
@@ -396,7 +396,7 @@ describe("MarkdownRenderer.js", () => {
});
it("strip keeps intraword underscores intact", () => {
- const url = "https://git.quad4.io/RNS-Things/MeshChatX/src/branch/dev/docs/meshchatx_on_raspberry_pi.md";
+ const url = "https://github.com/Quad4-Software/MeshChatX/src/branch/dev/docs/meshchatx_on_raspberry_pi.md";
expect(MarkdownRenderer.strip(url)).toBe(url);
});
@@ -488,7 +488,7 @@ describe("MarkdownRenderer.js", () => {
const msg = [
"# Deploy notes",
"",
- "Read https://git.quad4.io/RNS-Things/MeshChatX/src/branch/dev/docs/meshchatx_on_raspberry_pi.md, then ping",
+ "Read https://github.com/Quad4-Software/MeshChatX/src/branch/dev/docs/meshchatx_on_raspberry_pi.md, then ping",
"nomadnet://1dfeb0d794963579bd21ac8f153c77a4:/page/meshchatx_on_pi.mu",
"",
"`inline_code` and _italic_ and snake_case stay sane.",
@@ -500,7 +500,7 @@ describe("MarkdownRenderer.js", () => {
const result = MarkdownRenderer.render(msg);
expect(result).toContain("<h1");
expect(result).toContain(
- 'href="https://git.quad4.io/RNS-Things/MeshChatX/src/branch/dev/docs/meshchatx_on_raspberry_pi.md"'
+ 'href="https://github.com/Quad4-Software/MeshChatX/src/branch/dev/docs/meshchatx_on_raspberry_pi.md"'
);
expect(result).toContain('data-nomadnet-url="1dfeb0d794963579bd21ac8f153c77a4:/page/meshchatx_on_pi.mu"');
expect(result).toContain("<code");
diff --git a/tests/frontend/fixtures/settingsPageTestApi.js b/tests/frontend/fixtures/settingsPageTestApi.js
index d27f42ba..246db2d7 100644
--- a/tests/frontend/fixtures/settingsPageTestApi.js
+++ b/tests/frontend/fixtures/settingsPageTestApi.js
@@ -126,7 +126,7 @@ export function buildFullServerConfig(overrides = {}) {
nomad_micron_wasm_enabled: true,
nomad_micron_default_engine: "js",
nomad_default_page_path: "/page/index.mu",
- gitea_base_url: "https://git.quad4.io",
+ gitea_base_url: "",
...overrides,
};
}
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────